#ifndef __MY_CONFIG__
#define __MY_CONFIG__
#include<mutex>
#include"util.hpp"

namespace Cloud{
#define CONFIG_FILE "./cloud.conf"
    class Config
    {
        private:
            Config()
            {
                ReadConfigFile();
            }
            static Config*_instance;
            static std::mutex _mutex;
        private:
            bool ReadConfigFile()
            {
                FileUtil fu(CONFIG_FILE);
                std::string body;
                if(fu.GetContent(&body)==false)
                {
                    std::cout<<"load config file failed!\n";
                    return false;
                }
                Json::Value root;
                if(JsonUtil::UnSerialize(body,&root)==false)
                {
                    std::cout<<"parse config file failed!\n";
                    return false;
                }
                _hot_time=root["hot_time"].asInt();
                _server_port=root["server_port"].asInt();
                _server_ip=root["server_ip"].asString();
                _download_prefix=root["download_prefix"].asString();
                _packfile_suffix=root["packfile_suffix"].asString();
                _pack_dir=root["pack_dir"].asString();
                _back_dir=root["back_dir"].asString();
                _backup_file=root["backup_file"].asString();
                return true;
            }
        public:
            static Config*GetInstance()
            {
                if(_instance==NULL)//进行二次检测，防止单例模式的锁冲突
                {
                    _mutex.lock();
                    if(_instance==nullptr)
                    {
                        _instance=new Config();
                    }
                    _mutex.unlock();
                }
                return  _instance;
            }
            int GetHotTime()
            {
                return _hot_time;
            }
            int GetServerPort()
            {
                return _server_port;
            }
            std::string GetServerIp()
            {
                return _server_ip;
            }
            std::string GetDownLoadPrefix()
            {
                return _download_prefix;
            }
            std::string GetPackFileSuffix()
            {
                return _packfile_suffix;
            }
            std::string GetPackDir()
            {
                return _pack_dir;
            }
            std::string GetBackDir()
            {
                return _back_dir;
            }
            std::string GetBackupFile()
            {
                return _backup_file;
            }
        private:            
            int _hot_time;
            int _server_port;
            std::string _server_ip;
            std::string _download_prefix;
            std::string _packfile_suffix;
            std::string _pack_dir;
            std::string _back_dir;
            std::string _backup_file;
    };
    Config*Config::_instance=NULL;
    std::mutex Config::_mutex;
};
#endif